#include "stdio_impl.h"
#include "../internal/atomic.h"
#include <nxos.h>

int __lockfile(FILE *f)
{
	int owner = f->lock, tid = NX_ThreadGetCurrentId();
	if ((owner & ~MAYBE_WAITERS) == tid) /* locked by current thread */
		return 0;
	owner = a_cas(&f->lock, 0, tid);
	if (!owner) return 1;
	while ((owner = a_cas(&f->lock, 0, tid|MAYBE_WAITERS))) {
		if ((owner & MAYBE_WAITERS) ||
		    a_cas(&f->lock, owner, owner|MAYBE_WAITERS)==owner) {
				// __futexwait(&f->lock, owner|MAYBE_WAITERS, 1);
				/* todo: wait until owner is me */
				NX_ThreadYield();
			}
	}
	return 1;
}

void __unlockfile(FILE *f)
{
	if (a_swap(&f->lock, 0) & MAYBE_WAITERS) /* has waiter on lock */
		; // __wake(&f->lock, 1, 1);
}
